import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;

import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import java.security.spec.AlgorithmParameterSpec;

// 两个算法结合
public class AES {

    // 加密
    public static String AESEncode(String pwd) throws Exception{
        // 实例化AES密钥
        SecretKeySpec key = new SecretKeySpec("1234567890abcdef".getBytes(), "AES");
        // 实例化 iv
        AlgorithmParameterSpec iv = new IvParameterSpec("1234567890abcdef".getBytes());
        // 初始化密钥的模式
        Cipher aes = Cipher.getInstance("AES/CBC/PKCS5Padding");
        // 设置加密
        aes.init(1, key, iv);
        // 字符串加密
        byte[] bres = aes.doFinal(pwd.getBytes());
        // base64加密
        String str = new BASE64Encoder().encode(bres);
        System.out.println(str);
        return str;
    }

    // 解密
    public static String AESDEcode(String pwd) throws Exception{
        // base64解密
         byte[] p = new BASE64Decoder().decodeBuffer(pwd);

        // 实例化AES密钥
        SecretKeySpec key = new SecretKeySpec("1234567890abcdef".getBytes(), "AES");
        // 实例化 iv
        AlgorithmParameterSpec iv = new IvParameterSpec("1234567890abcdef".getBytes());
        // 初始化密钥的模式
        Cipher aes = Cipher.getInstance("AES/CBC/PKCS5Padding");
        // 设置加密
        aes.init(2, key, iv);
        // 字符串加密
        byte[] bres = aes.doFinal(p);
        // base64加密
        String str = new String(bres);
        System.out.println(str);
        return str;
    }

    public static void main(String[] args) throws Exception{
        //MessageDigest sha256 = MessageDigest.getInstance("SHA-256");
        //sha256.update("12345678".getBytes());
        //byte[] buf = new byte[32];
        //System.arraycopy(sha256.digest(), 0, buf, 0, buf.length);
        // 加密
        String encode = AESEncode("a12345678");
        // 解密
        String decode = AESDEcode(encode);
    }
}
